home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / Dots & Pixels / sources / recorder.cp < prev    next >
Text File  |  1995-09-29  |  5KB  |  178 lines

  1. #include <assert.h>
  2. #include <ctype.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include <Windows.h>
  8. #include <QDOffscreen.h>
  9. #include <Memory.h>
  10. #include <Fonts.h>
  11. #include <Packages.h>
  12. #include <SegLoad.h>
  13. #include <ToolUtils.h>
  14. #include <TextEdit.h>
  15.  
  16. #include <Movies.h>
  17.  
  18. #include "general.h"
  19. #include "port.h"
  20. #include "gworld.h"
  21. #include "recorder.h"
  22.  
  23. recorder::recorder( char *filename,
  24.     gworld *theWorld,                // defines size of movie
  25.     long framerate,
  26.     long compressiontype,
  27.     int  keyframedistance,            // 0 implies no frame differencing
  28.     long compressionquality,        // 0x100 thru 0x300 allowed
  29.     long temporalquality)
  30. {
  31.     myworld              = theWorld;
  32.     myframerate          = framerate;
  33.     mycompressiontype    = compressiontype;
  34.     mykeyframedistance   = keyframedistance;    
  35.     mycompressionquality = compressionquality;
  36.     mytemporalquality    = temporalquality;
  37.  
  38.     theWorld->get_rect( &movieFrame);
  39.     theWorld->get_pixH( &thepix);
  40.     
  41.     const int movieWidth  = movieFrame.right  - movieFrame.left;
  42.     const int movieHeight = movieFrame.bottom - movieFrame.top;
  43.     
  44.     movieDepth  = theWorld->diepte();
  45.     
  46.     sequence_running = false;
  47.     
  48.     const short default_volume = 0;
  49.     
  50.     #ifdef applec
  51.         c2pstr( filename);
  52.     #else
  53.         CtoPstr( filename);
  54.     #endif
  55.     
  56.     OSErr error = FSMakeFSSpec( default_volume, 0, (ConstStr255Param)filename, &myFSSpec);
  57.     CheckForError( !((error == fnfErr) || (error == noErr)), "FSMakeFSSpec");
  58.     
  59.     error = CreateMovieFile( &myFSSpec, 'TVOD', 0,
  60.             createMovieFileDeleteCurFile, &myResFileNo, &myMovie);
  61.     CheckForError( error, "CreateMovieFile");
  62.     
  63.     myTrack = NewMovieTrack( myMovie, movieWidth << 16, movieHeight << 16, 0);
  64.     CheckForError( GetMoviesError(), "NewMovieTrack");
  65.  
  66.     myMedia = NewTrackMedia( myTrack, VideoMediaType, myframerate, nil, (OSType) nil);
  67.     CheckForError( GetMoviesError(), "NewTrackMedia");
  68.     
  69.     error = BeginMediaEdits( myMedia);
  70.     CheckForError( GetMoviesError(), "BeginMediaEdits");
  71.     
  72.     myImageDescriptionHandle = (ImageDescriptionHandle)NewHandle( 4);
  73.     
  74.     CheckForError( (myImageDescriptionHandle == 0), "NewHandle( 4)");
  75.     
  76.     error = GetMaxCompressionSize( &thepix, &movieFrame, movieDepth,
  77.             mycompressionquality, mycompressiontype, anyCodec, &maxCompressedFrameSize);
  78.             
  79.     CheckForError( error, "GetMaxCompressionSize");
  80.     
  81.     myFrameBitsHandle = NewHandle( maxCompressedFrameSize);
  82.     
  83.     CheckForError( (myFrameBitsHandle == 0), "NewHandle");
  84.     
  85.     HLock( myFrameBitsHandle);
  86. }
  87.  
  88. void recorder::StartSequence()
  89. {
  90.     if( sequence_running)
  91.     {
  92.         DebugStr( "\pStartSequence called while one is running. Exiting!");
  93.         exit( EXIT_FAILURE);
  94.     } else {
  95.         sequence_running = true;
  96.     }
  97.     OSErr error;
  98.     
  99.     error = CompressSequenceBegin( &mySequence, &thepix, nil, &movieFrame, nil, movieDepth,
  100.             mycompressiontype, anyCodec, mycompressionquality, mytemporalquality,
  101.             mykeyframedistance, nil, (unsigned short)codecFlagUpdatePrevious,
  102.             myImageDescriptionHandle);
  103.     
  104.     CheckForError( error, "CompressSequenceBegin");
  105. }
  106.  
  107. void recorder::EndSequence()
  108. {
  109.     if( !sequence_running)
  110.     {
  111.         DebugStr( "\pEndSequence called while none is running. Exiting!");
  112.         exit( EXIT_FAILURE);
  113.     } else {
  114.         sequence_running = false;
  115.     }
  116.     OSErr error;
  117.     error = CDSequenceEnd( mySequence);
  118.     CheckForError( error, "CDSequenceEnd");
  119. }
  120.  
  121. recorder::~recorder()
  122. {
  123.     if( sequence_running)
  124.     {
  125.         DebugStr( "\precorder::~recorder called while a sequence is running. Exiting!");
  126.         exit( EXIT_FAILURE);
  127.     }
  128.     short resourceID = 1;
  129.     
  130.     OSErr error;
  131.     error = EndMediaEdits( myMedia );
  132.     CheckForError( error, "EndMediaEdits");
  133.  
  134.     error = InsertMediaIntoTrack( myTrack, 0L, 0L, GetMediaDuration( myMedia), (Fixed)(1<<16));
  135.     CheckForError( error, "InsertMediaIntoTrack");
  136.  
  137.     error = AddMovieResource( myMovie, myResFileNo, &resourceID, myFSSpec.name);
  138.     CheckForError( error, "AddMovieResource");
  139.  
  140.     error = MakeFilePreview( myResFileNo, (ICMProgressProcRecordPtr)-1); 
  141.  
  142.     CheckForError( error, "MakeFilePreview");
  143.  
  144.     error = CloseMovieFile( myResFileNo);
  145.     CheckForError( error, "CloseMovieFile");
  146.     
  147.     DisposeMovie( myMovie);
  148.     DisposeHandle( myFrameBitsHandle);
  149.     DisposeHandle( (Handle)myImageDescriptionHandle);
  150. }
  151.  
  152. void recorder::AddFrame( TimeValue duration)
  153. {
  154.     if( !sequence_running)
  155.     {
  156.         DebugStr( "\pAddFrame called while no sequence is running. Exiting!");
  157.         exit( EXIT_FAILURE);
  158.     }
  159.     long CompressedFrameSize = maxCompressedFrameSize;
  160.  
  161.     unsigned char similarity;
  162.     
  163.     OSErr error = CompressSequenceFrame( mySequence, &thepix, &movieFrame,
  164.             (unsigned short)codecFlagUpdatePrevious, StripAddress( *myFrameBitsHandle),
  165.             &CompressedFrameSize, &similarity, nil);
  166.     CheckForError( error, "CompressSequenceFrame");
  167.     //
  168.     //    pascal OSErr AddMediaSample(Media m,Handle dataIn,long inOffset,unsigned long size,
  169.     //    TimeValue durationPerSample,SampleDescriptionHandle sampleDescriptionH,
  170.     //    long numberOfSamples,short sampleFlags,TimeValue *sampleTime)
  171.     //    = {0x303C,0x7C,0xAAAA}; 
  172.     //
  173.     error = AddMediaSample( myMedia, myFrameBitsHandle, 0L, CompressedFrameSize,
  174.                 duration, (SampleDescriptionHandle)myImageDescriptionHandle, 1L,
  175.                 similarity ? mediaSampleNotSync : 0, &sampTime);
  176.     CheckForError( error, "AddMediaSample");
  177. }
  178.